package ModelAndController;
/*
 * Kompozit hálózati elemek bemeneti és kimeneti kapujának 
 * megvalósítására szolgáló egység. A Gate egyetlen bemenetei 
 * huzallal és tetszőleges kimeneti huzal referenciájával rendelkezhet. 
 * A mindenkori belső állapota a bemeneti huzal állapotának felel meg.
 */
//Exception 160 es 179 kozott
public class Gate extends Element{
	//a kapu belső állapota
	private int state;
	//konstruktor
	public Gate(){
		state = -1;
	}
	//Az elem belső állapotának változását végzi a bemenetek értékének függvényében.
	//Ha az adott elem változott, akkor azt jelzi a visszatérési értéken.
	public boolean isUpdateSuccess(){
		boolean retValue = false;
		if(shouldUpdate){
			retValue=actualUpdate();
			shouldUpdate = false;
		}
		
		buffer = Integer.toString( state );
		return retValue;
	}
	//Kiszámolja,hogy a bemenetek alapján milyen állapotot kell felvennie és 
	//ha az állapota ezzel változik,akkor meghívja a megfelelő függvényt
	private boolean actualUpdate(){
		boolean retValue = false;
		int newState = inputWires[0].getState();
		
		if(state != newState){
			retValue = true;
			state = newState;
			
			allOutputWiresShouldUpdate();
		}
		
		return retValue;
	}
	//Az elem belső állapotának értékét adja vissza.
	public int getState(int nbOfOutput){
		return state;
	}
	//Az elem bemeneteinek számát állítja be
	public void setInputWireNumbers(int nbOfInputWires) throws Exception{
		if( nbOfInputWires != 1 )
			throw new Exception("160");
		inputWires = new Wire[ nbOfInputWires ];
	}
	//Az aktuális bemenetet állítja be
	public void setActualInputWire(int nbOfWire,Wire act) throws Exception{
		if( inputWires == null )
			throw new Exception("161");
		if(nbOfWire != 0)
			throw new Exception("162");
		
		inputWires[ nbOfWire ] = act;
	}
	//Az elem kimeneteinek számát állítja be
	public void setOutputNumbers(int nbOfOutput) throws Exception{
		if(nbOfOutput != 1)
			throw new Exception("163");
		
		outputWires = new Wire[1][nbOfOutput];
	}
	//Az aktuális kimenetet állítja be
	public void setActualOutputWire(int nbOfOutputWireAct, Wire copy){
		
		outputWires[0][nbOfOutputWireAct] = copy;
	}
	//a shouldUpdate változó értékét adja vissza
	public boolean getShouldUpdate(){
		return shouldUpdate;
	}
	
}
